package com.czk.practice.codec;

import com.czk.practice.domain.PacketMap;
import com.czk.util.SerializationUtil;
import io.netty.buffer.ByteBuf;
import io.netty.channel.ChannelHandlerContext;
import io.netty.handler.codec.ByteToMessageDecoder;

import java.util.List;

/**
 * @Author:ChenZhangKun
 * @Date: 2021/8/19 15:14
 */
public class Decoder extends ByteToMessageDecoder {
    @Override
    protected void decode(ChannelHandlerContext channelHandlerContext, ByteBuf byteBuf, List<Object> list) throws Exception {
        if (byteBuf.readableBytes() < 4) {
            return;
        }
        // 标记
        byteBuf.markReaderIndex();
        // 拿到长度
        int i = byteBuf.readInt();
        if (byteBuf.readableBytes() < i) {
            byteBuf.resetReaderIndex();
            return;
        }
        // 读取指令->读取byte类型的数据，此时应该是指令
        byte b = byteBuf.readByte();
        // 因为有以为是指令，所以内容减少一位
        byte[] data = new byte[i - 1];
        // 读取传输的内容数据
        byteBuf.readBytes(data);
        list.add(SerializationUtil.deserialize(data, PacketMap.classMap.get(b)));
    }
}
